package com.cloud.easy.im.handler;

import com.cloud.easy.im.handler.strategy.websocket.AgreementWebSocketCKeepLiveHandler;
import com.cloud.easy.im.processor.OnlineProcessor;
import com.cloud.easy.im.utils.CharsetHelper;
import io.netty.channel.Channel;
import io.netty.util.internal.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Objects;

/**
 * websocket 管理器
 *
 * @author wangjian
 * @version 0.1.0
 * @create 2020年09月15日10:40 上午
 */
public class ServerWebSocketCoreHandler extends AbstractServerHandler {

    private static final Logger logger = LoggerFactory.getLogger(ServerWebSocketCoreHandler.class);

    /**
     * 构造核心处理器逻辑
     */
    public ServerWebSocketCoreHandler() {
        strategyList.add(new AgreementWebSocketCKeepLiveHandler());
    }

    @Override
    public void sessionCreat(Channel session) {
        logger.debug("[WEB_SOCKET_CORE_HANDLER]客户端：" + CharsetHelper.sessionToString(session) + "已建立会话链接");

    }

    @Override
    public void sessionClosed(Channel session) {
        String userId = OnlineProcessor.getUserIdFromSession(session);
        if (!StringUtil.isNullOrEmpty(userId)) {
            Channel inOnlineSeesion = OnlineProcessor.getInstance().getOnlineSession(userId, OnlineProcessor.getProductCodeFromSession(session));

            logger.info("[WEB_SOCKET_CORE_HANDLER]客户端：" + CharsetHelper.sessionToString(session) + "会话已关闭");

            if (Objects.nonNull(inOnlineSeesion) && session == inOnlineSeesion) {
                OnlineProcessor.getInstance().removeUser(userId,OnlineProcessor.getProductCodeFromSession(session));

                if (serverEventListener != null) {
                    serverEventListener.onUserLogoutAction_CallBack(userId, null, session);
                } else {
                    logger.debug("[WEB_SOCKET_CORE_HANDLER]>> 会话" + CharsetHelper.sessionToString(session)
                            + "被系统close了，但回调对象是null，没有进行回调通知.");
                }
            } else {
                {
                    logger.warn("[WEB_SOCKET_CORE_HANDLER]【注意】会话" + CharsetHelper.sessionToString(session) +
                            "不在在线列表中，意味着它是被客户端弃用的，本次忽略这条关闭事件即可！");
                }
            }
        } else {
            logger.warn("[WEB_SOCKET_CORE_HANDLER]【注意】会话" + CharsetHelper.sessionToString(session) +
                    "被系统close了，但它里面没有存放user_id，它很可能是没有成功合法认证而被提前关闭，从而正常释放资源。");
        }

    }

    @Override
    public void exceptionCaught(Channel session, Throwable cause) {
        logger.warn("客户端：" + CharsetHelper.sessionToString(session) + "抛出异常，原因是：" + cause.getMessage() + "，可以提前close掉了哦！", cause);
        session.close();
    }
}
